package com.example.aa175.fcn;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import androidx.core.content.FileProvider;
import android.util.Log;

import java.io.File;
import java.io.IOException;

public class Utils {

    /**
     * @param activity 活动
     * @param requestCode 请求码
     * @return 拍摄图像的路径
     */
    public static String startCamera(Activity activity, int requestCode) {
        Uri imageUri; // 图片路径
        
        // 获取相册目录路径
        String galleryPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString();

        // 生成一个唯一的文件名
        String imageName = "YourImageName" + System.currentTimeMillis() + ".jpg";

        // 图片保存到相册路径
        File outputImage = new File(galleryPath, imageName);
        Log.d("outputImage", outputImage.getAbsolutePath());
        try {
            if (outputImage.exists()) {
                outputImage.delete();
            }
            outputImage.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (Build.VERSION.SDK_INT >= 23) {
            // 兼容性提升
            imageUri = FileProvider.getUriForFile(activity,
                    "com.example.aa175.fcn", outputImage);
        } else {
            imageUri = Uri.fromFile(outputImage);
        }
        // 开启相机的Intent
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        // 指定图片的保存路径
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        // 设置图像的质量
        intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
        activity.startActivityForResult(intent, requestCode);
        // 返回图像的保存路径
        return outputImage.getAbsolutePath();
    }

    public static void updateGallery(Context context, String imagePath) {
        // 发送广播通知媒体库更新
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); // 通知图库更新
        File file = new File(imagePath); // 获取文件的Uri
        Uri contentUri = Uri.fromFile(file); // 设置Uri
        mediaScanIntent.setData(contentUri); // 发送广播
        context.sendBroadcast(mediaScanIntent); // 打印
    }

    /**
     * @param activity 活动
     * @param requestCode 请求码
     */
    public static void startAlbum(Activity activity, int requestCode) {
        Intent intent = new Intent(Intent.ACTION_PICK); // 打开相册
        intent.setType("image/*"); // 设置类型
        activity.startActivityForResult(intent, requestCode); // 打开相册
    }

    /**
     * @param context 上下文
     * @param uri 资源标识
     * @return 路径值
     */
    public static String getPathFromUri(Context context, Uri uri) {
        String result; // 结果
        Cursor cursor = context.getContentResolver().query(uri, null, null, null, null); // 查询
        if (cursor == null) {
            result = uri.getPath(); // 获取路径
        } else {
            cursor.moveToFirst(); // 移动到第一行
            int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); // 获取索引
            result = cursor.getString(idx); // 获取路径
            cursor.close(); // 关闭
        }
        return result;
    }

    /**
     * @param image_array 输入的四维数组
     * @param dim_info 未读信息
     * @return
     */
    public static Bitmap getBitmap(float[][][] image_array, int[] dim_info) { // 获取Bitmap对象
        int count = 0; // 计数
        int[] color_info = new int[dim_info[0] * dim_info[1]]; // 颜色信息
        // 遍历图像,获取颜色信息
        for (int i = 0; i < dim_info[0]; i++) {
            for (int j = 0; j < dim_info[1]; j++) {
                float[] arr = image_array[i][j]; // 获取像素点的颜色信息
                int alpha = 255; // 透明度
                int red = (int) arr[0];  // 红色
                int green = (int) arr[1];// 绿色
                int blue = (int) arr[2]; // 蓝色
                int tempARGB = (alpha << 24) | (red << 16) | (green << 8) | blue; // 合成ARGB
                color_info[count++] = tempARGB; // 存储颜色信息
            }
        }
        // 创建bitmap对象
        return Bitmap.createBitmap(color_info, dim_info[0], dim_info[1], Bitmap.Config.ARGB_8888);
    }

    /**
     * @param filePath 文件路径
     * @return Bitmap对象
     */
    public static Bitmap getScaleBitmapByPath(String filePath) {
        BitmapFactory.Options options = new BitmapFactory.Options(); // 创建BitmapFactory.Options对象
        options.inJustDecodeBounds = true; // 设置为true,表示解码时只获取图片的大小信息
        BitmapFactory.decodeFile(filePath, options); // 解码
        int width = options.outWidth; // 获取宽度
        int height = options.outHeight; // 获取高度
        int maxSize = 500; // 设置最大尺寸
        options.inSampleSize = 1; // 设置缩放比例
        while (true) {
            if (width / options.inSampleSize < maxSize || height / options.inSampleSize < maxSize) {
                break;
            } // 缩放比例
            options.inSampleSize *= 2; // 缩放比例
        }
        options.inJustDecodeBounds = false; // 设置为false,表示解码时获取图片的全部信息

        // 返回解码后的图片
        return BitmapFactory.decodeFile(filePath, options);
    }


    /**
     * @param origin 原始Bitmap
     * @param newWidth 缩放后的宽度
     * @param newHeight 缩放后的高度
     * @return 缩放后的Bitmap
     */
    public static Bitmap getScaleBitmapByBitmap(Bitmap origin, int newWidth, int newHeight) {
        // 如果输入的Bitmap为空，则直接返回
        if (origin == null) {
            return null;
        }
        // 原始Bitmap的长宽
        int height = origin.getHeight();
        int width = origin.getWidth();

        // 计算缩放后的图像比例
        float scaleWidthRatio= ((float) newWidth) / width;
        float scaleHeightRatio = ((float) newHeight) / height;

        // 创建操作图像的Matrix对象
        Matrix matrix = new Matrix();
        matrix.postScale(scaleWidthRatio, scaleHeightRatio);

        // 创建新的Bitmap
        Bitmap scaledBitmap = Bitmap.createBitmap(origin, 0, 0, width, height, matrix, false);
        if (!origin.isRecycled()) {
            origin.recycle();
        }
        return scaledBitmap;
    }
}